#include "net.hpp"
#include "dispatcher.hpp"
#include <thread>

void onMessage(const jsonrpc::BaseConnection::ptr& conn , jsonrpc::BaseMessage::ptr& msg)
{
    using std::cout;
    using std::endl;

    // 测试rpc调用
    std::string body = msg->serialize();
    cout << body << endl;
}

void test_client_common()
{
    auto client = jsonrpc::ClientFactory::create("127.0.0.1", 9090);
    client->setMessageCallback(onMessage);
    client->connect();

    // 构建rpc请求
    auto rpc_req = jsonrpc::MessageFactory::create<jsonrpc::RpcRequest>();
    rpc_req->setId("123456");
    rpc_req->setMType(jsonrpc::MType::REQ_RPC);
    rpc_req->setMethod("Add");

    Json::Value paras;
    paras["num1"] = 11;
    paras["num2"] = 22;
    rpc_req->setparameters(paras);

    // 发生请求
    client->send(rpc_req);
    std::this_thread::sleep_for(std::chrono::seconds(10));
    client->shutdown();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 不足: 访问一个请求里的所有元素, 需要用到子类(访问收限制)
// 不然需要直接强转 
// 使用模板优化
void onRpcRsp(const jsonrpc::BaseConnection::ptr& conn, jsonrpc::RpcResponse::ptr& msg)
{
    std::cout << "收到RPC响应" << std::endl;
    std::string body = msg->serialize();
    std::cout << body << std::endl;
}

void onTopicRsp(const jsonrpc::BaseConnection::ptr& conn, jsonrpc::TopicResponse::ptr& msg)
{
    std::cout << "收到Topic响应" << std::endl;
    std::string body = msg->serialize();
    std::cout << body << std::endl;
}


void test_dispatcher()
{
    // 在之前的基础上, 加一个dispatcher
    auto dispatcher = std::make_shared<jsonrpc::Dispatcher>();
    // 1.1注册映射关系
    dispatcher->registerHandler<jsonrpc::RpcResponse>(jsonrpc::MType::RSP_RPC, onRpcRsp); 
    dispatcher->registerHandler<jsonrpc::TopicResponse>(jsonrpc::MType::RSP_TOPIC, onTopicRsp); 

    auto client = jsonrpc::ClientFactory::create("127.0.0.1", 9090);
    
    // 1.2设置dispatcher里的onMessage为回调函数, 收到消息后, 回根据我们注册的消息类型, 找到对应的回调函数并调用
    auto message_cb = std::bind(&jsonrpc::Dispatcher::onMessage, dispatcher.get(), 
                                                     std::placeholders::_1, std::placeholders::_2);
    client->setMessageCallback(message_cb);
    client->connect();

    // 2.1构建rpc请求
    auto rpc_req = jsonrpc::MessageFactory::create<jsonrpc::RpcRequest>();
    rpc_req->setId("11111");
    rpc_req->setMType(jsonrpc::MType::REQ_RPC);
    rpc_req->setMethod("Add");

    Json::Value paras;
    paras["num1"] = 11;
    paras["num2"] = 22;
    rpc_req->setparameters(paras);

    // 2.2构建topic请求
    auto topic_req = jsonrpc::MessageFactory::create<jsonrpc::TopicRequest>();
    topic_req->setId("22222");
    topic_req->setMType(jsonrpc::MType::REQ_TOPIC);
    topic_req->setOptype(jsonrpc::TopicOptype::TOPIC_CREATE);
    topic_req->setTopicKey("xxx");


    // 3发送请求
    client->send(rpc_req);
    client->send(topic_req);
    std::this_thread::sleep_for(std::chrono::seconds(10));
    client->shutdown();
}

int main()
{
    test_dispatcher();
    return 0;
}